#ifndef _LED_BOARD_H_
#define _LED_BOARD_H_

#include <config.h>
#include <stdbool.h>

#if _BOARD_TYPE_ == _V31_A_BOARD_
// 事件指示灯
#define BASIC_EVENT_LED_PIN                       GPIO_Pin_9

// 警报指示灯
#define BASIC_ALARM_LED_PIN                        GPIO_Pin_12
// 警报呼吸灯 PWM 编码
#define BASIC_ALARM_BREATHING_LIGHT_CHANNEL        CH_PWM4

#elif _BOARD_TYPE_ == _V32_A_BOARD_
// 事件指示灯
#define BASIC_EVENT_LED_PIN                        GPIO_Pin_10

// 警报指示灯
#define BASIC_ALARM_LED_PIN                        GPIO_Pin_7
// 警报呼吸灯 PWM 编码
#define BASIC_ALARM_BREATHING_LIGHT_CHANNEL        CH_PWM9

#elif _BOARD_TYPE_ == _V32_B_BOARD_
// 事件指示灯
#define BASIC_EVENT_LED_PIN                        GPIO_Pin_10

// 警报指示灯
#define BASIC_ALARM_LED_PIN                        GPIO_Pin_14
// 警报呼吸灯 PWM 编码
#define BASIC_ALARM_BREATHING_LIGHT_CHANNEL        CH_PWM10

#elif _BOARD_TYPE_ == _V33_A_BOARD_
// 事件指示灯
#define BASIC_EVENT_LED_PIN                        GPIO_Pin_1

// 警报指示灯
#define BASIC_ALARM_LED_PIN                        GPIO_Pin_23
// 警报呼吸灯 PWM 编码
#define BASIC_ALARM_BREATHING_LIGHT_CHANNEL        CH_PWM11

#elif _BOARD_TYPE_ == _V33_B_BOARD_
// 键盘指示灯
#define BASIC_KEYBOARD_LED_PIN                     GPIO_Pin_6
// 事件指示灯
#define BASIC_EVENT_LED_PIN                        GPIO_Pin_13
// 事件呼吸灯 PWM 编码
#define BASIC_EVENT_BREATHING_LIGHT_CHANNEL        CH_PWM5

// 警报指示灯
#define BASIC_ALARM_LED_PIN                        GPIO_Pin_12
// 警报呼吸灯 PWM 编码
#define BASIC_ALARM_BREATHING_LIGHT_CHANNEL        CH_PWM4

#elif _BOARD_TYPE_ == _V33_C_BOARD_
// 键盘指示灯
#define BASIC_KEYBOARD_LED_PIN                     GPIO_Pin_12
// 事件指示灯
#define BASIC_EVENT_LED_PIN                        GPIO_Pin_7
// 事件呼吸灯 PWM 编码
#define BASIC_EVENT_BREATHING_LIGHT_CHANNEL        CH_PWM9

// 警报指示灯
#define BASIC_ALARM_LED_PIN                        GPIO_Pin_6
// 警报呼吸灯 PWM 编码
#define BASIC_ALARM_BREATHING_LIGHT_CHANNEL        CH_PWM8

#elif _BOARD_TYPE_ == _DA01_A_BOARD_
// 事件指示灯
#define BASIC_EVENT_LED_PIN                        GPIO_Pin_2

// 警报指示灯
#define BASIC_ALARM_LED_PIN                        GPIO_Pin_3
// 警报呼吸灯 PWM 编码
#define BASIC_ALARM_BREATHING_LIGHT_CHANNEL        CH_PWM9

#elif _BOARD_TYPE_ == _EC01_BOARD_
#define BASIC_RESULT_LED_PIN                       GPIO_Pin_1 //PB1
// 事件指示灯
#define BASIC_EVENT_LED_PIN                        GPIO_Pin_2 //PB2

// 警报指示灯
#define BASIC_ALARM_LED_PIN                        GPIO_Pin_0 //PB0
// 警报呼吸灯 PWM 编码
#define BASIC_ALARM_BREATHING_LIGHT_CHANNEL        CH_PWM6
#endif

// 低等提示翻转周期          - 150ms
#define WEAK_CUE_FLASHING_PERIOD                           (150ul)
// 中等提示翻转周期          - 250ms
#define MEDIUM_FLASHING_PERIOD                             (250ul)
// 高等提示翻转周期          - 800ms
#define STRONG_PROMPTING_FLASHING_PERIOD                   (800ul)
// 长延时                   - 2s
#define LONG_DELAY_TIME                                    (2000ul)

// 警报提示翻转周期          - 50ms
#define ALARM_HINT_FLASHING_PERIOD                         (50ul)

// 呼吸灯闪烁周期           - 100ms
#define BREATHING_LIGHT_FLASHING_PERIOD                    (100ul)
// 递增数值
#define BREATHING_LIGHT_INCREASING_VALUE                   (5ul)
//
#define GREEN_LEDLONG_DELAY_TIME                           (3000ul)
// 设备未授权，蓝灯常亮4s
#define DEVICE_UNAUTHORIZED_BLINKING_PERIOD                (4000ul)
// 设备一秒间隔一次
#define DEVICE_ONE_SECOND_PERIOD                           (1000ul)
// 循环次数（为无限次）
#define LOOP_FOREVER_COUNT 0xFF
// 开锁蓝灯常亮间隔UNLOCK_KEEY_LIGNTING_PERIOD
#define UNLOCK_KEEY_LIGNTING_PERIOD                        (8000ul)//约等于6s
// io板固件更新提示间隔
#define IO_BOARD_FIRMWARE_UPDATE_STATUS_PERIOD             (250ul)

/**
 * @brief 指示灯模式
 *
 */
typedef enum
{
  LED_HINT_OFF,            // 关闭
  LED_HINT_FLASHES,        // 闪烁
  LED_HINT_NORMAILON,      // 常亮
  LED_HINT_BREATHING_MODE, // 呼吸灯
} IndicatorStatus_t;

/**
 * @brief LED 闪烁次数
 *
 */
typedef enum
{
  LED_FLASH_STARTUP_COUNT                     = 0x01, // 启动
  LED_FLASH_LOCKED_IN_COUNT                   = 0x01, // 反锁
  LED_FLASH_LOW_POWER_COUNT                   = 0x06, // 低电压
  LED_FLASH_FALSE_LOCK_COUNT                  = 0x06, // 假锁
  LED_FLASH_KEY_INSERTED_COUNT                = 0x02, // 钥匙插入
  LED_FLASH_CONNECT_TEST_COUNT                = 0x0A, // 连接测试
  LED_FLASH_SYSTEM_LOCKED_COUNT               = 0x01, // 提示锁保护
  LED_FLASH_HOST_CONNECT_LOSE_COUNT           = 0x08, // 主机连接丢失
  LED_FLASH_SYSTEM_INITIALIZE_COUNT           = 0x08, // 系统初始化状态
  LED_FLASH_ANTI_BREAKING_ALARM_COUNT         = 0x06, // 防撬警报
  LED_FLASH_NOT_IN_VALID_PERIOD_COUNT         = 0x01, // 不在有效期内
  LED_FLASH_KEY_OPERATION_ERROR_COUNT         = 0x01, // 密钥操作失败
  LED_FLASH_SET_PARAMETER_ERROR_COUNT         = 0x03, // 设置参数失败
  LED_FLASH_DEVICE_LOCKED_STATUS_COUNT        = 0x01, // 设备处于锁定状态
  LED_FLASH_AUTHENTICATION_ERROR_COUNT        = 0x06, // 鉴权失败
  LED_FLASH_SET_PARAMETER_SUCCESS_COUNT       = 0x03, // 设置参数成功
  LED_FLASH_KEY_HAS_BEEN_REPLACED_COUNT       = 0x0A, // 密钥已顶替
  LED_FLASH_KEY_OPERATION_SUCCESS_COUNT       = 0x04, // 密钥操作成功
  LED_FLASH_DEVICE_SELF_TEST_ERROR_COUNT      = 0x02, // 设备自检失败
  LED_FLASH_AUTHENTICATION_SUCCESS_COUNT      = 0x01, // 鉴权成功
  LED_FLASH_CAED_AFFILIATION_ERROR_COUNT      = 0x03, // 卡片附属错误
  LED_FLASH_FUNCTION_CARD_DISABLED_COUNT      = 0x08, // 功能卡未启用
  LED_FLASH_DEVICE_SELF_TEST_SUCCESS_COUNT    = 0x01, // 设备自检成功
  LED_FLASH_DEVICE_INTO_STANDBY_MODE_COUNT    = 0x01, // 设备进入待机模式
  LED_FLASH_NETWORK_ATTACHMENT_ERROR_COUNT    = 0x03, // 网络附着失败
  LED_FLASH_NETWORK_ATTACHMENT_SUCCESS_COUNT  = 0x01, // 网络附着成功
  LED_FLASH_SET_COMP_STATUS_SUCCESS_COUNT  = 0x01,    // 设置完成状态
  LED_FLASH_SET_INIT_STATUS_COUNT  = 0x01,            // 初始化次数 
} BasicNumberOfLedFlash_t;

/**
 * @brief 声光模式
 *
 */
typedef enum
{
  LED_HINT_IDLE ,                            // 空闲
  LED_HINT_UNLOCK,                           // 开锁
  LED_HINT_STARTUP,                          // 启动
  LED_HINT_LOW_POWER,                        // 低电量
  LED_HINT_TIME_ERROR,                       // 时间错误
  LED_HINT_KEY_INSERTED,                     // 钥匙插入
  LED_HINT_CONNECT_TEST,                     // 连接测试
  LED_HINT_CARD_REPLACE,                     // 卡片已经被顶替
  LED_HINT_LOCKED_TIGGER,                    // 反锁触发
  LED_HINT_SYSTEM_LOCKED,                    // 系统上锁
  LED_HINT_USER_KEYED_KEYS,                  // 用户键入按键
  LED_HINT_DEVICE_SELF_TEST,                 // 启动设备自检
  LED_HINT_FALSE_LOCK_TIGGER,                // 假锁触发
  LED_HINT_HOST_CONNECT_LOSE,                // 主机不应答
  LED_HINT_DEVICE_LOCKED_STATE,              // 设备处于锁定状态
  LED_HINT_DEVICE_INITIALIZING,              // 设备处于初始化状态
  LED_HINT_KEY_OPERATION_ERROR,              // 密钥操作失败
  LED_HINT_SET_PARAMETER_ERROR,              // 设置参数错误
  LED_HINT_ONLINE_REGISTER_USER,             // 在线注册用户
  LED_HINT_START_LOCAL_REGISTER,             // 本地注册用户
  LED_HINT_KEY_OPERATION_SUCCESS,            // 密钥操作成功
  LED_HINT_SET_PARAMETER_SUCCESS,            // 设置参数成功
  LED_HINT_CAED_AFFILIATION_ERROR,           // 卡片归属错误
  LED_HINT_FUNCTION_CARD_DISABLED,           // 功能卡被禁用
  LED_HINT_DECICE_SELF_TEST_ERROR,           // 设备自检失败
  LED_HINT_INSUFFICIENT_PRIVILEGES,          // 权限不足
  LED_HINT_NETWORK_ATTACHMENT_START,         // 网络附着触发
  LED_HINT_NETWORK_ATTACHMENT_ERROR,         // 网络附着失败
  LED_HINT_DEVICE_INTO_STANDBY_MODE,         // 设备进入待机模式
  LED_HINT_ANTI_BREAKING_ALARM_TIGGER,       // 防撬警报触发
  LED_HINT_START_SAFETY_MODULE_AUTHENTICATE, // 启动安全模块认证
  LED_HINT_SET_COMPLETE_STATUS,               // 设置完成状态
  LED_HINT_SET_IO_BOARD_FIRMWARE_UPDATE_STATUS, // 设置IO板固件更新状态
} BlinkMode_t;

/**
 * @brief 指示灯状态
 *
 */
typedef struct
{
  uint8_t Count;            // 次数
  BlinkMode_t Mode;         // 模式
  IndicatorStatus_t Status; // 状态
} LedStatus_t;

/**
 * @brief 呼吸灯状态
 *
 */
typedef struct
{
  bool HintStatus;   // 状态
  uint8_t DutyCycle; // 占空比
} BreathingLight_t;

/**
 * @brief 提示设备启动
 *
 */
extern void PromptDeviceStartup(void);

/**
 * @brief 提示反锁恢复
 * 
 */
extern void PromptDoorLockedRecovered(void);

/**
 * @brief 提示门已反锁
 *
 */
extern void PromptDoorLockedTigger(void);

/**
 * @brief 提示不在有效期
 *
 */
extern void PromptOutOfValidityPeriod(void);

/**
 * @brief 提示关锁
 *
 */
extern void PromptDoorLock(void);

/**
 * @brief 提示开锁
 *
 */
extern void PromptDoorUnlock(void);

/**
 * @brief 提示鉴权失败
 *
 */
extern void PromptAuthenticationError(void);

/**
 * @brief 提示密钥已顶替
 *
 */
extern void PromptKeyHasBeenReplaced(void);

/**
 * @brief 提示设备处于初始化
 *
 */
extern void PromptDeviceIsInitializing(void);

/**
 * @brief 提示启动设备自检
 *
 */
extern void PromptStartDeviceSelfTest(void);

/**
 * @brief 提示退出设备自检
 *
 */
extern void PromptExitDeviceSelfTest(void);

/**
 * @brief 提示设备自检失败
 *
 * @param ErrorType - 错误类型
 */
extern void PromptDeviceSelfTestError(uint8_t ErrorType);

/**
 * @brief 卡片归属出错
 *
 */
extern void PromptCardAffiliationError(void);

/**
 * @brief 该功能卡已禁用
 * 
 */
extern void PromptThisFunctionCardHasBeenDisabled(void);

/**
 * @brief 提示假锁恢复
 *
 */
extern void PromptFalseLockAlarmRecovered(void);

/**
 * @brief 提示假锁触发
 *
 */
extern void PromptFalseLockTigger(void);

/**
 * @brief 提示低电压
 *
 */
extern void PromptLowPower(void);

/**
 * @brief 设置参数失败
 *
 */
extern void PromptSetParameterError(void);

/**
 * @brief 提示设置参数成功
 *
 */
extern void PromptSetParameterSuccess(void);

/**
 * @brief 提示系统已锁定
 *
 */
extern void PromptSystemLocked(void);

/**
 * @brief 提示启动本地注册
 *
 */
extern void PromptStartLocalRegistration(void);

/**
 * @brief 提示退出本地注册
 *
 */
extern void PromptExitLocalRegistration(void);

/**
 * @brief 提示密钥操作成功
 *
 */
extern void PromptKeyOperationError(void);

/**
 * @brief 提示密钥操作失败
 *
 */
extern void PromptKeyOperationSuccess(void);

/**
 * @brief 提示退出设备锁定
 *
 */
extern void PromptExitDeviceLockedState(void);

/**
 * @brief 提示设备处于锁定状态
 *
 */
extern void PromptDeviceIsInLockedState(void);

/**
 * @brief 提示网络附着结束
 * 
 */
extern void PromptNetworkAttachmentEnd(void);

/**
 * @brief 提示网络附着启动
 *
 */
extern void PromptNetworkAttachmentStart(void);

/**
 * @brief 提示网络附着成功
 *
 */
extern void PromptNetworkAttachmentSuccess(void);

/**
 * @brief 提示网络附着失败
 *
 */
extern void PromptNetworkAttachmentError(void);

/**
 * @brief 提示撬锁警报恢复
 *
 */
extern void PromptAntiPickingRecovered(void);

/**
 * @brief 提示防撬警报触发
 *
 */
extern void PromptAntiPickingAlarm(void);

/**
 * @brief 提示用户键入密码
 *
 */
extern void PromptUserKeyedKeys(void);

/**
 * @brief 提示退出用户键入
 *
 */
extern void PromptExitKeyEntry(void);

/**
 * @brief 提示主机连接丢失
 *
 */
extern void PromptHostConnectionLose(void);

/**
 * @brief 提示连接测试
 *
 */
extern void PromptConnectTest(void);

/**
 * @brief 提示钥匙已拔出
 *
 */
extern void PromptKeyRemove(void);

/**
 * @brief 提示钥匙已插入
 *
 */
extern void PromptKeyInserted(void);

/**
 * @brief 提示在线注册用户
 *
 */
extern void PromptOnlineRegisterUser(void);

/**
 * @brief 提示退出在线注册
 *
 */
extern void PromptExitOnlineRegisterUser(void);

/**
 * @brief 提示退出外部安全模组鉴权
 *
 */
extern void PromptExitSafetyModuleAuthentication(void);

/**
 * @brief 提示启动外部安全模组鉴权
 *
 */
extern void PromptStartSafetyModuleAuthentication(void);

/**
 * @brief 提示进入待机模式
 *
 */
extern void PromptIntoStandby(void);

/**
 * @brief 提示进入io板升级固件
 * 
 */
extern void PromptIntoIoBoardUpdataFirmware(void);

/**
 * @brief 提示退出待机模式
 *
 */
extern void PromptExitStandbyMode(void);

/**
 * @brief 停止所有声光提示
 *
 */
extern void StopAllLightAlerts(void);

/**
 * @brief 事件指示灯处理函数
 *
 */
extern void EventLedTaskHandler(void);

/**
 * @brief 警报指示灯回调
 *
 */
extern void AlarmLedTaskHandler(void);

/**
 * @brief 键盘指示灯回调
 *
 */
extern void KeyboardLedTaskHandler(void);

/**
 * @brief 获取指示灯是否开启
 *
 * @return bool - 指示灯状态(true：开启 false：关闭)
 */
extern bool CheckIfTheIndicatorLightIsOn(void);

/**
 * @brief 指示灯板载功能初始化
 *
 */
extern void LedBoardInitialisation(void);

/**
 * @brief 关闭所有指示灯
 * 
 */
extern void CloseAllLed(void);

/**
 * @brief  结果指示灯回调
 * 
 */
extern void ResultLedTaskHandler(void);

/**
 * @brief  设置完成状态 (接口)
 * 
 */
extern void PromptSetCompleteStatus(void);

/**
 * @brief  授权安装成功 (接口)
 * 
 */
extern void PromptAuthenticationInstallSuccess(void);

/**
 * @brief  未授权 (接口)
 * 
 */
extern void PromptAuthenticationInstallFailure(void);

/**
 * @brief  板子固件更新状态指示：蓝灯快闪(接口)
 * 
 */
extern void PromptIoBoardFirmwareUpdate(void);
#endif
